H-6763: Migrate voice interviews to GPT-Realtime-2 - #9399
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
1 Skipped Deployment
|
|
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
PR SummaryHigh Risk Overview
A new The voice UI snapshot moves from a single phase to connection / input / output axes and drops Done speaking, Interrupt and speak, and related manual turn controls; docs in the website README describe the new preview behavior. Reviewed by Cursor Bugbot for commit 1e373ff. Bugbot is set up for automated code reviews on this repo. Configure here. |
2405857 to
37d9a99
Compare
9dab60c to
86c1fba
Compare
b46dfcb to
50df2da
Compare
lunelson
left a comment
There was a problem hiding this comment.
This is the honest pivot. ADR-0009 is rewritten, the dedicated Speech path is gone, and the new line is clear: Realtime is disposable media, Brunch still owns questions and state. Net deletion is the right shape after #9357/#9378. The website-owned bridge is the right place for that crossing.
Three questions.
The old record required exact canonical text into Speech. The new one tells gpt-realtime-2 to speak response_text verbatim and says generated audio is not guaranteed to match. Visible Brunch text stays authoritative, which is correct. Is “speak these strings” via a realtime model the fidelity you want, or is that an accepted preview trade?
Spoken answers now start as a continue_interview tool call, then the bridge submits through Petrinaut. The first turn can start Brunch with no pending ask. Keyboard still uses the composer. Is the composer still the one submission path, or is Realtime now a second front door?
The rewritten ADR still names renderInterviewStage and the Chat/Interview seams. #9467 replaces those with Voice mode. Worth aligning the record with whatever that PR actually ships.
Approving as-is.
50df2da to
d6443b8
Compare
86c1fba to
925d469
Compare
d6443b8 to
b1872b8
Compare
925d469 to
9be5566
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 73798b3. Configure here.
Co-authored-by: Cursor <cursoragent@cursor.com>
Ensure initial spoken descriptions reach Brunch, dynamic questions render correctly, and canonical responses use the expert-interviewer voice. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep implementation-only planning artifacts out of the product pull request. Co-authored-by: Cursor <cursoragent@cursor.com>
Serialize canonical speech, isolate cancelled tool streams, and tolerate only correlated provider no-op errors. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Retry canonical speech when its provider error arrives after the blocking response ends, and bind answer revisions to the question active when submission began. Co-authored-by: Cursor <cursoragent@cursor.com>


🌟 What is the purpose of this PR?
Migrate the H-6763 voice interview from a transcription-plus-TTS chain to
gpt-realtime-2as an ephemeral duplex media shell, while keeping Brunch the sole durable authority for interview state and business logic. Present canonical Brunch output through a warm, professionally neutral expert-interviewer voice.🔗 Related links
🚫 Blocked by
🔍 What does this change?
gpt-realtime-2WebRTC session with audio input/output, low-effort reasoning, low-eagerness semantic VAD, automatic interruption, and one requiredcontinue_interviewfunction.brunch_askcorrelation, and rejects duplicate, overlapping, or stale work.brunch_askas a dynamic AI SDK tool so Petrinaut recognizes and renders each returned question.Pre-Merge Checklist 🚀
🚢 Has this modified a publishable library?
This PR:
📜 Does this require a change to the docs?
The changes in this PR:
🕸️ Does this require a change to the Turbo Graph?
The changes in this PR:
🐾 Next steps
🛡 What tests cover this?
brunch_asktool streaming and return-path handling.gpt-realtime-2WebRTC preflight confirmed remote RTP audio, function calling, semantic VAD, and automatic interruption with the configured key.❓ How to test this?
PETRINAUT_OPENAI_VOICE_ENABLED=true,OPENAI_VOICE_API_KEY, and a working Brunch endpoint.brunch_askcall exactly once.📹 Demo
No screenshot replacement is required; the affected documentation contains no screenshots of this surface.